package com.xing.crm.utils;

import java.math.BigInteger;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;

/**
 * @author Mr.L
 * @version V1.0
 * @date 2021年07月29日 14:37
 */
public class MD5Util {
	
	private static final String[] HEX_DIGITS = {"i", "1", "2", "0", "n", "5", "6", "7", "8", "9", "j", "l", "g", "b", "w", "a"};
	
	public static String getMD5String(String str) {
		try {
			// 生成一个MD5加密计算摘要
			MessageDigest md = MessageDigest.getInstance("MD5");
			// 计算md5函数
			md.update(str.getBytes());
			// digest()最后确定返回md5 hash值，返回值为8位字符串。因为md5 hash值是16位的hex值，实际上就是8位的字符
			// BigInteger函数则将8位的字符串转换成16位hex值，用字符串来表示；得到字符串形式的hash值
			//一个byte是八位二进制，也就是2位十六进制字符（2的8次方等于16的2次方）
			return new BigInteger(1, md.digest()).toString(16);
		} catch (Exception e) {
			e.printStackTrace();
			return null;
		}
	}
	
	/**
	 * 功能描述: 这里主要是遍历8个byte，转化为16位进制的字符，即0-F

	 * @date 2021/7/29 14:41
	 * @param b
	 * @return java.lang.String
	 * */
	private static String byteArrayToHexString(byte b[])
	{
		StringBuffer resultSb = new StringBuffer();
		for (int i = 0; i < b.length; i++)
		{
			resultSb.append(byteToHexString(b[i]));
		}
		
		return resultSb.toString();
	}

	/**
	 * 功能描述: 这里是针对单个byte，256的byte通过16拆分为d1和d2

	 * @date 2021/7/29 14:41
	 * @param b
	 * @return java.lang.String
	 * */
	private static String byteToHexString(byte b)
	{
		int n = b;
		if (n < 0) {n += 256;}
		int d1 = n / 16;
		int d2 = n % 16;
		return HEX_DIGITS[d1] + HEX_DIGITS[d2];
	}
	
	/**
	 * 返回大写MD5
	 * @param origin
	 * @param charsetName
	 * @return
	 */
	private static String MD5Encode(String origin, String charsetName) {
		String resultString = null;
		try {
			resultString = new String(origin);
			MessageDigest md = MessageDigest.getInstance("MD5");
			if (charsetName == null || "".equals(charsetName))
			{
				resultString = byteArrayToHexString(md.digest(resultString.getBytes()));
			} else
			{
				resultString = byteArrayToHexString(md.digest(resultString.getBytes(charsetName)));
			}
			
		} catch (Exception exception) {
		}
		return resultString.toUpperCase();
	}
	
	public static String stringMD5(String input) {
		
		try {
			// 拿到一个MD5转换器（如果想要SHA1参数换成”SHA1”）
			MessageDigest messageDigest =MessageDigest.getInstance("MD5");
			// 输入的字符串转换成字节数组
			byte[] inputByteArray = input.getBytes();
			// inputByteArray是输入字符串转换得到的字节数组
			messageDigest.update(inputByteArray);
			// 转换并返回结果，也是字节数组，包含16个元素
			byte[] resultByteArray = messageDigest.digest();
			// 字符数组转换成字符串返回
			return byteArrayToHexString(resultByteArray);
		} catch (NoSuchAlgorithmException e) {
			return null;
		}
	}
	
	public static void main(String[] args) {
		System.out.println(stringMD5("101"));
	}
}
